Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com。
在今天,我們將建立一個基於 Docker + docker-compose 的開發環境,把 Django、MariaDB 封裝在容器中。這樣做的好處是:
Dockerfile
、docker-compose.yml
Docker 是一套容器化技術,可以將應用程式及其所有依賴打包成一個容器(Container)。透過 Docker,我們可以:
docker-compose.yml
是一個 YAML 檔,用來定義和管理多個 Docker 容器的設定與組合。它解決了單靠 Dockerfile 難以處理多容器協作的問題(例如:前端 + 後端 + 資料庫)。
Dockerfile
是一個純文字檔,用來定義一個 Docker 映像檔(image)如何建立。它就像是一份「建構藍圖」,告訴 Docker 要安裝什麼、執行什麼,才能建出你需要的環境。
docker --version
docker-compose --version
在專案根目錄建立 Dockerfile
:
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update && apt-get install -y \
gcc \
default-libmysqlclient-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --upgrade pip && pip install -r requirements.txt
這份檔案主要目的是最後兩行: 依照
requirements.txt
安裝套件,也就是建立虛擬環境
這是一個用來建立 Python 應用程式 Docker 映像檔的 Dockerfile。以下是各行的簡單說明:
FROM python:3.11-slim
使用 Python 3.11 的輕量版映像作為基礎,可以快速建立起來。
ENV PYTHONDONTWRITEBYTECODE=1
避免 Python 產生 .pyc
位元組碼檔案(不必要的檔案)。
ENV PYTHONUNBUFFERED=1
讓 Python 輸出不使用緩衝區,方便日誌立即輸出到終端。
WORKDIR /app
設定容器內的工作目錄為 /app
。
RUN apt-get update && apt-get install -y \ ...
安裝必要的系統套件,如:
gcc
: 編譯 C 擴展用default-libmysqlclient-dev
: 安裝 MySQL 用的開發套件pkg-config
: 編譯時用來偵測套件的工具COPY requirements.txt .
將本地的 requirements.txt
複製到容器的 /app
目錄。
RUN pip install --upgrade pip && pip install -r requirements.txt
升級 pip 並安裝 requirements.txt
中列出的 Python 套件。
因此在部署之前要確保
requirements.txt
內有所有我們會用到的套件。
在根目錄新增 docker-compose.yml
檔案:
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
container_name: django_web
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- mariadb
mariadb:
image: mariadb:11.7.2
container_name: my_mariadb
restart: always
environment:
MYSQL_DATABASE: my_database
MYSQL_USER: ptt_rag
MYSQL_PASSWORD: ptt_rag
MYSQL_ROOT_PASSWORD: root
ports:
- "3307:3306"
volumes:
- ./mariadb_data:/var/lib/mysql
這份檔案可視為一份部署計畫書,目的是建立這兩個服務(容器):
build
指定的 Dockerfile
建立環境,啟動時執行 python manage.py runserver
命令對外開放在 8000 埠口,並掛載本機目錄以利開發同步。
mariadb
本地的 port 號設成 3307 是因為我們本地測試的部分是 3306 ,避免撞號。
明天【Day05】:Docker 環境建置 - 建立可攜式開發與執行環境 (下),我們將接續今天未完成的部分,完整部署到 Docker 的容器!